package functionalTest;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.platform.suite.api.Suite;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import static org.junit.Assert.*;

import java.time.Duration;
import java.util.List;

public class InputTest {
    private static WebDriver webDriver;
    private static String path = "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe";

    @Before
    public void setUp() {
        // 设置 chromeDriver 路径
        System.setProperty("webdriver.chrome.driver", path);
        webDriver = new ChromeDriver();
        // 打开Java API文档搜索项目
        webDriver.get("http://47.120.16.255:8080/index.html");

    }

    @Test
    public void testValid0() {
        testSearch("String", true);
    }

    @Test
    public void testValid1() {
        testSearch("ArrayList", true);
    }

    @Test
    public void testValid2() {
        testSearch("12", true);
    }

    @Test
    public void testValid3() {
        testSearch("a123b", true);
    }

    @Test
    public void testInvalid0() {
        testSearch("数组", false);
    }

    @Test
    public void testInvalid1() {
        testSearch(",,,Ar,p,", false);
    }

    @Test
    public void testInvalid2() {
        testSearch("1=1,&&&%$23", false);
    }

    @Test
    public void testInvalid3() {
        testSearch("      ", false);
    }

    private void testSearch(String input, boolean isValid) {
        // 找到输入框元素
        WebElement searchBox = webDriver.findElement(By.cssSelector("body > div > div.header > input[type=text]"));
        searchBox.clear(); // 清空输入框
        searchBox.sendKeys(input); // 输入测试数据

        // 查找并点击搜索按钮
        WebElement searchButton = webDriver.findElement(By.cssSelector("#search-btn"));
        searchButton.click();

        // 显式等待确保结果加载完成或者提示错误信息
        WebDriverWait wait = new WebDriverWait(webDriver, Duration.ofSeconds(10));

        if (isValid) {
            // 有效等价类, 搜索结果是不应该为 0 的
            // 显示等待搜索结果完成
            wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("body > div > div.result > div:nth-child(1)")));

            // 定位包含结果统计信息的元素
            WebElement resultStats = webDriver.findElement(By.xpath("/html/body/div/div[2]/div[1]"));
            // 提取该元素文本信息
            String resultText = resultStats.getText();
            // 使用正则表达式提取数字
            String resultCount = resultText.replaceAll("\\D+", "");
            System.out.println("提取的搜索结果数为: " + resultCount);

            // 获取实质展示的搜索结果
            List<WebElement> results = webDriver.findElements(By.className("item"));
            System.out.println(results.size());
            // 使用断言判断两者是否一致
            assertEquals("展示搜索结果数和实际展示应保持一致", results.size(), Integer.parseInt(resultCount));
        }else {
            // 无效等价类, 搜索结果应该为空
            wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("body > div > div.result > div:nth-child(1)")));
            List<WebElement> results = webDriver.findElements(By.className("item"));
            System.out.println(results.size());
            assertTrue("搜索结果应为空", results.isEmpty());
        }
    }

//    @After
//    public void quit() {
//        webDriver.quit();
//    }
}
